#region Copyright

// AUTHOR: Omar Zabala
// Copyright (c) 2011, TheShieldStore.com
// All rights reserved.
// 
// Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
// 
// Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
// Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation
//  and/or other materials provided with the distribution. Neither the name of the TheShieldStore.com nor the names of its contributors may be used to endorse
//  or promote products derived from this software without specific prior written permission. 
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 
// AND ANY EXPRESS OR IMPLIED WARRANTIES,  INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 
// IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 
// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
//  EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

#endregion

public class Color
{
    private byte[] _byteColor = new byte[] {0xff, 0xff};
    private int[] _rgb = new[] {255, 255, 255};

    public Color(int r, int g, int b)
    {
        SetRGB(r, g, b);
    }

    public byte[] ByteColor
    {
        get { return _byteColor; }
    }

    public void SetRGB(int r, int g, int b)
    {
        if (r > 255)
            r = 255;
        else if (r < 0)
            r = 0;

        if (g > 255)
            g = 255;
        else if (g < 0)
            g = 0;

        if (b > 255)
            b = 255;
        else if (b < 0)
            b = 0;

        _rgb[0] = r;
        _rgb[1] = g;
        _rgb[2] = b;

        convert();
    }

    private void convert()
    {
        int temp = (((_rgb[0] >> 3) << 11) | ((_rgb[1] >> 2) << 5) | (_rgb[2] >> 3));

        _byteColor[0] = (byte) (temp >> 8);
        _byteColor[1] = (byte) (temp & 0x00FF);
    }

    public static bool operator ==(Color c1, Color c2)
    {
        return c1._byteColor[0] == c2._byteColor[0] && c1._byteColor[1] == c2._byteColor[1];
    }

    public static bool operator !=(Color c1, Color c2)
    {
        return !(c1._byteColor[0] == c2._byteColor[0] || c1._byteColor[1] == c2._byteColor[1]);
    }

    public override string ToString()
    {
        return "(" + _rgb[0] + ", " + _rgb[1] + ", " + _rgb[2] + ")";
    }
}